//
//  OSSpinLockDemo.m
//  MultiperThreadTest02
//
//  Created by FelixYin on 2020/4/4.
//  Copyright © 2020 FelixYin. All rights reserved.
//

#import "OSSpinLockDemo.h"
#import <libkern/OSAtomic.h>
#import "OSSpinLockDemo.h"


@interface OSSpinLockDemo ()

@property (nonatomic,assign) OSSpinLock ticketLock; //添加锁
@property (nonatomic,assign) OSSpinLock moneyLock; //添加锁

@end

@implementation OSSpinLockDemo


- (instancetype)init
{
    self = [super init];
    if (self) {
        self.ticketLock = OS_SPINLOCK_INIT; //初始化锁
        self.moneyLock = OS_SPINLOCK_INIT; //初始化锁
    }
    return self;
}


// MARK: 存钱取钱

/*
 解决线程访问带来的安全隐患：
 1.使用线程同步技术，通过加锁 可以解决问题
 
 方案一：
 添加自旋锁OSSpinLock, 等待锁的线程会处于忙等状态，一直占用着CPU资源 （目前已经不安全了，可能会出现优先级反转问题）
 
 可以通过汇编代码 查看到代码一直处于 循环调用状态（使用si 单步执行汇编代码，可以发现 一个区域的代码是循环调用 ）
 
 方案二：
 
 
 */

- (void) saveMoney{
    OSSpinLockLock(&_moneyLock); //加锁
    [super saveMoney];
    OSSpinLockUnlock(&_moneyLock); //解锁
    
}

- (void) drawMoney{
    OSSpinLockLock(&_moneyLock); //加锁
    [super drawMoney];
    OSSpinLockUnlock(&_moneyLock); //解锁
}


- (void) saveAndDrawMoney{
    [super saveAndDrawMoney];
}




// MARK:  卖票

- (void) saleTicket{
    OSSpinLockLock(&_ticketLock);
    [super saleTicket];
    OSSpinLockUnlock(&_ticketLock); //解锁
}

- (void) saleTickets{
    [super saleTickets];
}

@end
